home *** CD-ROM | disk | FTP | other *** search
/ PC World Interactive 4 / PC World Interactive 4.iso / online / appbar.EXE / cppsrc / Editdlg.cpp < prev    next >
C/C++ Source or Header  |  1996-09-23  |  15KB  |  432 lines

  1. // *********************************************************
  2. // AppBar -- Advanced Menu bar for Windows 95/NT
  3. // All code Copyright (C) 1995, 1996 by Mike Perham
  4. // mperham@cs.cornell.edu
  5. // 
  6. // This code MAY NOT be used for any other program without
  7. // my permission and is forbidden in any shareware/commercial
  8. // program.  This code is provided for educational use only
  9. // and there are no guarantees or promises implied.  Blah blah
  10. // *********************************************************
  11.  
  12. // EditDlg.cpp : implementation file
  13. //
  14.  
  15. #include "appbar.h"
  16. #include "globals.h"
  17.  
  18. #ifdef _DEBUG
  19. #define new DEBUG_NEW
  20. #undef THIS_FILE
  21. static char THIS_FILE[] = __FILE__;
  22. #endif
  23.  
  24. int mymax(int a, int b)
  25. {
  26.     if (a<b)
  27.         return b;
  28.     return a;
  29. }
  30.  
  31. int mymin(int a, int b)
  32. {
  33.     if (a<b)
  34.         return a;
  35.     return b;
  36. }
  37.  
  38. /////////////////////////////////////////////////////////////////////////////
  39. // EditDlg dialog
  40.  
  41. EditDlg::EditDlg(CWnd* pParent /*=NULL*/)
  42.     : CDialog(EditDlg::IDD, pParent)
  43. {
  44.     //{{AFX_DATA_INIT(EditDlg)
  45.         // NOTE: the ClassWizard will add member initialization here
  46.     //}}AFX_DATA_INIT
  47.     parent = (AppBarWin *) pParent;
  48. }
  49.  
  50. BEGIN_MESSAGE_MAP(EditDlg, CDialog)
  51.     //{{AFX_MSG_MAP(EditDlg)
  52.     ON_BN_CLICKED(IDC_APPDOWN, OnAppDown)
  53.     ON_BN_CLICKED(IDC_APPUP, OnAppUp)
  54.     ON_BN_CLICKED(IDC_MENUDOWN, OnMenuDown)
  55.     ON_BN_CLICKED(IDC_MENUUP, OnMenuUp)
  56.     ON_BN_CLICKED(IDB_DELAPP, OnDelApp)
  57.     ON_BN_CLICKED(IDB_DELMENU, OnDelMenu)
  58.     ON_BN_CLICKED(IDB_NEWAPP, OnNewApp)
  59.     ON_BN_CLICKED(IDB_NEWMENU, OnNewMenu)
  60.     ON_BN_CLICKED(IDB_SEPARATOR, OnSeparator)
  61.     ON_WM_DROPFILES()
  62.     ON_LBN_DBLCLK(IDC_APPLIST, OnDblclkApplist)
  63.     ON_LBN_DBLCLK(IDC_MENULIST, OnDblclkMenulist)
  64.     ON_LBN_SELCHANGE(IDC_MENULIST, OnSelchangeMenulist)
  65.     ON_LBN_SELCHANGE(IDC_APPLIST, OnSelchangeApplist)
  66.     //}}AFX_MSG_MAP
  67. END_MESSAGE_MAP()
  68.  
  69. /////////////////////////////////////////////////////////////////////////////
  70. // EditDlg message handlers
  71.  
  72. void EditDlg::OnAppDown()
  73. {
  74.     menus = glob_menu;
  75.     index = SendDlgItemMessage(IDC_MENULIST, LB_GETCURSEL, 0, 0);
  76.     if (index == LB_ERR) {ab_message(SELECT_MENU, ab.abwin->GetSafeHwnd());return;}
  77.     SendDlgItemMessage(IDC_MENULIST, LB_GETTEXT,(WPARAM) index,(LPARAM)((LPSTR) menu_sel));
  78.     menus = find_menu(menu_sel);
  79.     ASSERT(menus);
  80.     apps = menus->nextapp;
  81.     index = SendDlgItemMessage(IDC_APPLIST, LB_GETCURSEL, 0, 0);
  82.     if (index == LB_ERR) {ab_message(SELECT_ITEM, ab.abwin->GetSafeHwnd());return;}
  83.     SendDlgItemMessage(IDC_APPLIST, LB_GETTEXT,(WPARAM) index,(LPARAM)((LPSTR) app_sel));
  84.     apps = find_app(apps, app_sel);
  85.     ASSERT(apps);
  86.     if (apps->prevapp)
  87.         if (apps->prevapp->separator)
  88.             index--;
  89.     if (menus->nextapp == apps)
  90.         menus->nextapp = menus->nextapp->nextapp;
  91.     switch_places_a(apps, DOWN);
  92.     SendDlgItemMessage(IDC_APPLIST, LB_RESETCONTENT, 0, 0);
  93.     for (apps = menus->nextapp; apps; apps = apps->nextapp) {
  94.         if (apps->separator) 
  95.             SendDlgItemMessage(IDC_APPLIST, LB_INSERTSTRING, (WPARAM)-1, (LPARAM)((LPSTR)SEPARATOR_STRING));
  96.         SendDlgItemMessage(IDC_APPLIST, LB_INSERTSTRING, (WPARAM)-1, (LPARAM)((LPSTR)apps->appname));
  97.     }
  98.     GetDlgItem(IDC_APPLIST)->SetFocus();
  99.     int num = SendDlgItemMessage(IDC_APPLIST, LB_GETCOUNT, 0, 0);
  100.     SendDlgItemMessage(IDC_APPLIST, LB_SETCURSEL, (WPARAM) mymin(++index, --num), 0);
  101. }
  102.  
  103. void EditDlg::OnAppUp()
  104. {
  105.     menus = glob_menu;
  106.     index = SendDlgItemMessage(IDC_MENULIST, LB_GETCURSEL, 0, 0);
  107.     if (index == LB_ERR) {ab_message(SELECT_MENU, ab.abwin->GetSafeHwnd());return;}
  108.     SendDlgItemMessage(IDC_MENULIST, LB_GETTEXT,(WPARAM) index,(LPARAM)((LPSTR) menu_sel));
  109.     menus = find_menu(menu_sel);
  110.     ASSERT(menus);
  111.     apps = menus->nextapp;
  112.     index = SendDlgItemMessage(IDC_APPLIST, LB_GETCURSEL, 0, 0);
  113.     if (index == LB_ERR) {ab_message(SELECT_ITEM, ab.abwin->GetSafeHwnd());return;}
  114.     SendDlgItemMessage(IDC_APPLIST, LB_GETTEXT,(WPARAM) index,(LPARAM)((LPSTR) app_sel));
  115.     apps = find_app(apps, app_sel);
  116.     ASSERT(apps);
  117.     if (apps->nextapp)
  118.         if (apps->nextapp->separator)
  119.             index++;
  120.     if (menus->nextapp->nextapp)
  121.         if (menus->nextapp->nextapp == apps)
  122.             menus->nextapp = menus->nextapp->nextapp;
  123.     switch_places_a(apps, UP);
  124.     SendDlgItemMessage(IDC_APPLIST, LB_RESETCONTENT, 0, 0);
  125.     for (apps = menus->nextapp; apps; apps = apps->nextapp) {
  126.         if (apps->separator) 
  127.             SendDlgItemMessage(IDC_APPLIST, LB_INSERTSTRING, (WPARAM)-1, (LPARAM)((LPSTR)SEPARATOR_STRING));
  128.         SendDlgItemMessage(IDC_APPLIST, LB_INSERTSTRING, (WPARAM)-1, (LPARAM)((LPSTR)apps->appname));
  129.     }
  130.     GetDlgItem(IDC_APPLIST)->SetFocus();
  131.     SendDlgItemMessage(IDC_APPLIST, LB_SETCURSEL, (WPARAM) mymax(0, --index), 0);
  132. }
  133.  
  134. void EditDlg::OnDelApp() 
  135. {
  136.     BOOL flag = FALSE;
  137.  
  138.     index = SendDlgItemMessage(IDC_MENULIST, LB_GETCURSEL, 0, 0);
  139.     if (index == LB_ERR) {ab_message(SELECT_MENU, ab.abwin->GetSafeHwnd());return;}
  140.     SendDlgItemMessage(IDC_MENULIST, LB_GETTEXT, (WPARAM)index, (LPARAM)((LPSTR)menu_sel));
  141.     menus = find_menu(menu_sel);
  142.     ASSERT(menus);
  143.     index = SendDlgItemMessage(IDC_APPLIST, LB_GETCURSEL, 0, 0);
  144.     if (index == LB_ERR) {ab_message(SELECT_ITEM, ab.abwin->GetSafeHwnd());return;}
  145.     BOOL sep = FALSE;  // whether we should delete the separator
  146.     SendDlgItemMessage(IDC_APPLIST, LB_GETTEXT, (WPARAM)index, (LPARAM)((LPSTR)app_sel));
  147.     if (!strcmp(app_sel,SEPARATOR_STRING))  {       // User wants to delete a separator
  148.         SendDlgItemMessage(IDC_APPLIST, LB_GETTEXT, (WPARAM)++index, (LPARAM)((LPSTR)app_sel));
  149.         index--;
  150.         sep = TRUE;
  151.     }
  152.     apps = menus->nextapp;
  153.     apps = find_app(apps, app_sel);
  154.     ASSERT(apps);
  155.     if (sep)        // If we are deleting sep, just reset variable
  156.         apps->separator = FALSE;
  157.       else {    // else kill app structure
  158.         if (apps->separator) {
  159.             SendDlgItemMessage(IDC_APPLIST, LB_DELETESTRING, --index, 0);
  160.             flag = TRUE;
  161.         }
  162.         if (menus->nextapp == apps)
  163.             menus->nextapp = apps->nextapp;
  164.         killapp(apps);
  165.         menus->numapps--;
  166.     }
  167.     SendDlgItemMessage(IDC_APPLIST, LB_DELETESTRING, (WPARAM)index, 0);
  168.     GetDlgItem(IDC_APPLIST)->SetFocus();
  169.     if (flag) index--;
  170.     SendDlgItemMessage(IDC_APPLIST, LB_SETCURSEL, (WPARAM)index, 0);
  171. }
  172.  
  173. void EditDlg::OnDelMenu() 
  174. {
  175.     index = SendDlgItemMessage(IDC_MENULIST, LB_GETCURSEL, 0, 0);
  176.     if (index == LB_ERR) {ab_message(SELECT_MENU, ab.abwin->GetSafeHwnd());return;}
  177.     SendDlgItemMessage(IDC_MENULIST, LB_GETTEXT, (WPARAM)index, (LPARAM)((LPSTR)menu_sel));
  178.     menus = find_menu(menu_sel);
  179.     ASSERT(menus);
  180.     int i = MessageBox(CONFIRM_DELETE, CONFIRM_DELETE_TITLE, MB_YESNO);
  181.     if (i == IDYES) {
  182.         killmenu(menus);
  183.         SendDlgItemMessage(IDC_MENULIST, LB_DELETESTRING, (WPARAM)index, 0);
  184.         SendDlgItemMessage(IDC_APPLIST, LB_RESETCONTENT, 0, 0);
  185.     }
  186.     GetDlgItem(IDC_MENULIST)->SetFocus();
  187.     SendDlgItemMessage(IDC_MENULIST, LB_SETCURSEL, (WPARAM) index, 0);
  188. }
  189.  
  190. void EditDlg::OnMenuDown()
  191. {
  192.     index = SendDlgItemMessage(IDC_MENULIST, LB_GETCURSEL, 0, 0);
  193.     if (index == LB_ERR) {ab_message(SELECT_MENU, ab.abwin->GetSafeHwnd());return;}
  194.     SendDlgItemMessage(IDC_MENULIST, LB_GETTEXT, (WPARAM)index, (LPARAM)((LPSTR)menu_sel));
  195.     menus = find_menu(menu_sel);
  196.     ASSERT(menus);
  197.     switch_places_m(menus, DOWN);
  198.     SendDlgItemMessage(IDC_MENULIST, LB_RESETCONTENT, 0, 0);
  199.     for (menus = glob_menu; menus; menus = menus->nextmenu)
  200.         SendDlgItemMessage(IDC_MENULIST, LB_INSERTSTRING, (WPARAM)-1, (LPARAM)((LPSTR)menus->menuname));
  201.     GetDlgItem(IDC_MENULIST)->SetFocus();
  202.     int num = SendDlgItemMessage(IDC_MENULIST, LB_GETCOUNT, 0, 0);
  203.     SendDlgItemMessage(IDC_MENULIST, LB_SETCURSEL, (WPARAM) mymin(++index, --num), 0);
  204. }
  205.  
  206. void EditDlg::OnMenuUp()
  207. {
  208.     index = SendDlgItemMessage(IDC_MENULIST, LB_GETCURSEL, 0, 0);
  209.     if (index == LB_ERR) {ab_message(SELECT_MENU, ab.abwin->GetSafeHwnd());return;}
  210.     SendDlgItemMessage(IDC_MENULIST, LB_GETTEXT, (WPARAM)index, (LPARAM)((LPSTR)menu_sel));
  211.     menus = find_menu(menu_sel);
  212.     ASSERT(menus);
  213.     switch_places_m(menus, UP);
  214.     SendDlgItemMessage(IDC_MENULIST, LB_RESETCONTENT, 0, 0);
  215.     for (menus = glob_menu; menus; menus = menus->nextmenu)
  216.         SendDlgItemMessage(IDC_MENULIST, LB_INSERTSTRING, (WPARAM)-1, (LPARAM)((LPSTR)menus->menuname));
  217.     GetDlgItem(IDC_MENULIST)->SetFocus();
  218.     SendDlgItemMessage(IDC_MENULIST, LB_SETCURSEL, (WPARAM) mymax(0, --index), 0);
  219. }
  220.  
  221. void EditDlg::OnNewApp() 
  222. {
  223.     index = SendDlgItemMessage(IDC_MENULIST, LB_GETCURSEL, 0, 0);
  224.     if (index == LB_ERR) {ab_message(SELECT_MENU, ab.abwin->GetSafeHwnd());return;}
  225.     SendDlgItemMessage(IDC_MENULIST, LB_GETTEXT, (WPARAM)index, (LPARAM)((LPSTR)menu_sel));
  226.     menus = find_menu(menu_sel);
  227.     ASSERT(menus);
  228.     newapp = menus->nextapp;
  229.     if (newapp) 
  230.         while (newapp->nextapp)
  231.             newapp = newapp->nextapp;
  232.     hack Hack;
  233.     Hack.isnew = TRUE;
  234.     Hack.app = newapp;
  235.     Hack.menu = menus;
  236.  
  237.     NewApp na(this, &Hack);
  238.     na.DoModal();
  239. }
  240.  
  241. void EditDlg::OnNewMenu() 
  242. {
  243.     newmenu = glob_menu;
  244.     ASSERT(newmenu);
  245.     while (newmenu->nextmenu)
  246.         newmenu = newmenu->nextmenu;
  247.     hack Hack;
  248.     Hack.isnew = TRUE;
  249.     Hack.app = NULL;
  250.     Hack.menu = newmenu;
  251.  
  252.     NewMenu nm(this, &Hack);
  253.     nm.DoModal();
  254. }
  255.  
  256. void EditDlg::OnSeparator() 
  257. {
  258.     index = SendDlgItemMessage(IDC_MENULIST, LB_GETCURSEL, 0, 0);
  259.     if (index == LB_ERR) {ab_message(SELECT_MENU, ab.abwin->GetSafeHwnd());return;}
  260.     SendDlgItemMessage(IDC_MENULIST, LB_GETTEXT, (WPARAM)index, (LPARAM)((LPSTR)menu_sel));
  261.     menus = find_menu(menu_sel);
  262.     ASSERT(menus);
  263.     index = SendDlgItemMessage(IDC_APPLIST, LB_GETCURSEL, 0, 0);
  264.     if (index == LB_ERR) {ab_message(SELECT_ITEM, ab.abwin->GetSafeHwnd());return;}
  265.     SendDlgItemMessage(IDC_APPLIST, LB_GETTEXT, (WPARAM)index, (LPARAM)((LPSTR)app_sel));
  266.     apps = menus->nextapp;
  267.     apps = find_app(apps, app_sel);
  268.     ASSERT(apps);
  269.     if (apps->separator) return;  // Can't add a second separator!
  270.     apps->separator = TRUE;
  271.     SendDlgItemMessage(IDC_APPLIST, LB_INSERTSTRING, (WPARAM)index, (LPARAM)((LPSTR)SEPARATOR_STRING));
  272. }
  273.  
  274. void EditDlg::OnOK() 
  275. {
  276.     ab.SaveMenu();
  277.     parent->UpdateMenu();
  278.     parent->ModifyTime();
  279.     CDialog::OnOK();
  280. }
  281.  
  282. BOOL EditDlg::OnInitDialog() 
  283. {
  284.     CDialog::OnInitDialog();
  285.  
  286.     menuup.AutoLoad(IDC_MENUUP, this);
  287.     menudown.AutoLoad(IDC_MENUDOWN, this);
  288.     appup.AutoLoad(IDC_APPUP, this);
  289.     appdown.AutoLoad(IDC_APPDOWN, this);
  290.  
  291.     for (menus = glob_menu; menus; menus = menus->nextmenu)
  292.         SendDlgItemMessage(IDC_MENULIST, LB_INSERTSTRING, (WPARAM)-1, (LPARAM)((LPSTR)menus->menuname));
  293.     menus = glob_menu;
  294.     GetDlgItem(IDC_MENULIST)->DragAcceptFiles(TRUE);
  295.     GetDlgItem(IDB_DELMENU)->EnableWindow(FALSE);
  296.     GetDlgItem(IDB_DELAPP)->EnableWindow(FALSE);
  297.     GetDlgItem(IDB_SEPARATOR)->EnableWindow(FALSE);
  298.     return TRUE;
  299. }
  300.  
  301. void EditDlg::OnDropFiles(HDROP hd)
  302. {
  303.     RECT r;
  304.     POINT p;
  305.     div_t dt;
  306.     int i, num, width;
  307.     char *last_slash, *last_period, *name;
  308.  
  309.     num = DragQueryFile(hd, 0xFFFFFFFF, 0, 0);
  310.     DragQueryPoint(hd, &p);
  311.     SendDlgItemMessage(IDC_MENULIST, LB_GETITEMRECT, 0, (LPARAM)&r);
  312.     width = r.bottom - r.top;
  313.     dt = div(p.y, width);
  314.     dt.quot += SendDlgItemMessage(IDC_MENULIST, LB_GETTOPINDEX, 0, 0);
  315.     menus = glob_menu;
  316.     if (!menus) {DragFinish(hd); return;}
  317.     for (i=0;i<dt.quot;i++) {
  318.         if (menus->nextmenu)
  319.             menus = menus->nextmenu;
  320.           else {DragFinish(hd); return;}
  321.     }
  322.     while (num--)   {
  323.         apps = menus->nextapp;
  324.         if (apps)
  325.             while (apps->nextapp)
  326.                 apps = apps->nextapp;
  327.         if (apps) {
  328.             apps->nextapp = new app_struct;
  329.             apps->nextapp->prevapp = apps;
  330.             apps = apps->nextapp;
  331.           }     else {
  332.             menus->nextapp = new app_struct;
  333.             menus->nextapp->prevapp = NULL;
  334.             apps = menus->nextapp;
  335.         }
  336.         DragQueryFile(hd, num, apps->appexe, sizeof(apps->appexe));
  337.         last_slash = strrchr(apps->appexe, 0x5C);  // backslash
  338.         last_period = strrchr(apps->appexe, 0x2E); // period
  339.         if (!last_slash) 
  340.             last_slash = (char *) apps->appexe;
  341.         if (!last_period)
  342.             strcpy(apps->appname, last_slash);
  343.           else { 
  344.             last_slash++;
  345.             name = (char *) apps->appname;
  346.             while (last_slash != last_period) {
  347.                 *last_slash = tolower(*last_slash);
  348.                 *name++ = *last_slash++;
  349.             }
  350.         }
  351.         apps->appname[0] = (char) toupper((int)apps->appname[0]);
  352.         if (!strcmp(apps->appname, ""))
  353.             strcpy(apps->appname, DEFAULT_NAME);
  354.         menus->numapps++;
  355.  
  356.         char drive[40], path[80];
  357.         _splitpath(apps->appexe, drive, path, NULL, NULL);
  358.         sprintf(apps->workingdir, "%s%s", drive, path);
  359.         int len = strlen(apps->workingdir);
  360.         // we don't want to remove the \ in c:\
  361.         if (len>3)
  362.             // remove trailing backslash on directory
  363.             *(apps->workingdir + len - 1) = '\0';
  364.         SendDlgItemMessage(IDC_MENULIST, LB_SETCURSEL, i, 0);
  365.         GetDlgItem(IDC_MENULIST)->SetFocus();
  366.     }
  367.     DragFinish(hd);
  368.     return;
  369. }
  370.  
  371. void EditDlg::OnDblclkApplist() 
  372. {
  373.     menus = glob_menu;
  374.     index = SendDlgItemMessage(IDC_MENULIST, LB_GETCURSEL, 0, 0);
  375.     if (index == LB_ERR) {ab_message(SELECT_MENU, ab.abwin->GetSafeHwnd());return;}
  376.     SendDlgItemMessage(IDC_MENULIST, LB_GETTEXT,(WPARAM)  index,(LPARAM)((LPSTR) menu_sel));
  377.     menus = find_menu(menu_sel);
  378.     if (!menus) return;
  379.     apps = menus->nextapp;
  380.     index = SendDlgItemMessage(IDC_APPLIST, LB_GETCURSEL, 0, 0);
  381.     SendDlgItemMessage(IDC_APPLIST, LB_GETTEXT,(WPARAM) index,(LPARAM)((LPSTR) app_sel));
  382.     apps = find_app(apps, app_sel);
  383.     if (!apps) return;
  384.     hack Hack;
  385.     Hack.app = apps;
  386.     Hack.isnew = FALSE;
  387.     Hack.menu = menus;
  388.  
  389.     NewApp na(this, &Hack);
  390.     na.DoModal();
  391.     SendDlgItemMessage(IDC_APPLIST, LB_SETCURSEL, index, 0);
  392. }
  393.  
  394. void EditDlg::OnDblclkMenulist() 
  395. {
  396.     index = SendDlgItemMessage(IDC_MENULIST, LB_GETCURSEL, 0, 0);
  397.     if (index == LB_ERR) {ab_message(SELECT_MENU, ab.abwin->GetSafeHwnd());return;}
  398.     SendDlgItemMessage(IDC_MENULIST, LB_GETTEXT,(WPARAM) index,(LPARAM)((LPSTR) menu_sel));
  399.     menus = find_menu(menu_sel);
  400.     if (!menus) return;
  401.     hack Hack;
  402.     Hack.isnew = FALSE;
  403.     Hack.app = NULL;
  404.     Hack.menu = menus;
  405.     
  406.     NewMenu nm(this, &Hack);
  407.     nm.DoModal();
  408.     SendDlgItemMessage(IDC_MENULIST, LB_SETCURSEL, index, 0);
  409. }
  410.  
  411. void EditDlg::OnSelchangeMenulist() 
  412. {
  413.     GetDlgItem(IDB_DELMENU)->EnableWindow(TRUE);
  414.     index = SendDlgItemMessage(IDC_MENULIST, LB_GETCURSEL, 0, 0);
  415.     SendDlgItemMessage(IDC_MENULIST, LB_GETTEXT,(WPARAM) index,(LPARAM)((LPSTR) menu_sel));
  416.     menus = find_menu(menu_sel);
  417.     if (!menus) return;
  418.     // Found correct menu, now fill other listbox with apps
  419.     SendDlgItemMessage(IDC_APPLIST, LB_RESETCONTENT, 0,0);
  420.     for (apps = menus->nextapp; apps; apps = apps->nextapp) {
  421.         if (apps->separator)
  422.             SendDlgItemMessage(IDC_APPLIST, LB_ADDSTRING, 0, (LPARAM)((LPSTR) SEPARATOR_STRING));
  423.             SendDlgItemMessage(IDC_APPLIST, LB_ADDSTRING, 0, (LPARAM)((LPSTR) apps->appname));
  424.     }
  425. }
  426.  
  427. void EditDlg::OnSelchangeApplist() 
  428. {
  429.     GetDlgItem(IDB_DELAPP)->EnableWindow(TRUE);
  430.     GetDlgItem(IDB_SEPARATOR)->EnableWindow(TRUE);
  431. }
  432.